package com.nicolas.pattern.proxy;

/**
 * Proxy（代理主题角色）：它包含了对真实主题的引用，
 * 从而可以在任何时候操作真实主题对象；
 * 在代理主题角色中提供一个与真实主题角色相同的接口，
 * 以便在任何时候都可以替代真实主题；
 * 代理主题角色还可以控制对真实主题的使用，
 * 负责在需要的时候创建和删除真实主题对象，并对真实主题对象的使用加以约束。
 * 通常，在代理主题角色中，客户端在调用所引用的真实主题
 * 操作之前或之后还需要执行其他操作，而不仅仅是单纯调用真实主题对象中的操作。
 * @author nicolas  2017年2月12日 -- 下午4:13:34
 * 
 * ProxySearcher：代理查询类，充当代理主题角色，它是查询代理，
 * 维持了对RealSearcher对象、AccessValidator对象和Logger对象的引用。
 */
public class ProxySearcher implements Searcher{
	private RealSearcher searcher = new RealSearcher(); //维持一个对真实主题的引用  
    private AccessValidator validator;  
    private Logger logger;  

    //创建访问验证对象并调用其Validate()方法实现身份验证  
    public boolean Validate(String userId)  
    {  
        validator = new AccessValidator();  
        return validator.Validate(userId);  
    }  

    //创建日志记录对象并调用其Log()方法实现日志记录  
    public void Log(String userId)  
    {  
        logger = new Logger();  
        logger.Log(userId);  
    }

	@Override
	public String DoSearch(String userId, String keyword) {
		//如果身份验证成功，则执行查询  
        if (this.Validate(userId))  
        {  
        	String result = searcher.DoSearch(userId, keyword); //调用真实主题对象的查询方法  
            this.Log(userId); //记录查询日志  
            return result; //返回查询结果  
        }  
        else  
        {  
            return null;  
        }  
	}  
}
